package com.gking.aiService.interceptor;


import com.gking.aiService.common.BaseContext;
import com.gking.aiService.common.Result;
import com.gking.aiService.utils.commonUtil.JsonUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;


/**
 * 一个Spring MVC的控制器增强（Controller Advice），
 * 用于拦截和修改控制器方法的响应体。
 */
@Slf4j
@ControllerAdvice
public class ResponseBodyAdviceInterceptor implements ResponseBodyAdvice<Object> {


    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        // 判断该拦截器是否支持对应的控制器方法返回类型
        return true; // 对所有控制器方法都应用该拦截器
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
                                  Class<? extends org.springframework.http.converter.HttpMessageConverter<?>> selectedConverterType,
                                  ServerHttpRequest request, ServerHttpResponse response) {

        // if (body == null) {
        //     return new HashMap<>(); // 返回空 JSON 而不是 null
        // }

        // 处理 LinkedHashMap 转换为 Result 导致序列化失败的情况
//        if (body instanceof LinkedHashMap) {
//            LinkedHashMap<?, ?> linkedHashMap = (LinkedHashMap<?, ?>) body;
//
//            // 手动将 LinkedHashMap 转换为 Result
//            Result<Object> result = new Result<>();
//            if (linkedHashMap.containsKey("code")) result.setCode((Integer) linkedHashMap.get("code"));
//
//            if (linkedHashMap.containsKey("message")) result.setMessage((String) linkedHashMap.get("message"));
//
//            // 存储一下响应结果
//            BaseContext.setResponseBody(JsonUtils.serialize(result));
//            return result; // 返回转换后的 Result
//        }

        // 在响应体写入到输出流之前调用此方法

        // 在这里可以访问和修改响应体
        if (body instanceof ResponseEntity) {
            // 如果响应体是 ResponseEntity 类型，可以解包以获取实际的响应体内容
            ResponseEntity<?> responseEntity = (ResponseEntity<?>) body;
            Object responseBody = responseEntity.getBody();
            log.info("Response responseBody: {}", responseBody);
            // 根据需要对 responseBody 进行修改
        } else {
            // 如果响应体不是 ResponseEntity，它就代表控制器方法实际返回的响应体内容
            // 可以直接对 'body' 进行修改

            Result<Object> result = (Result<Object>) body;

            // 存储一下响应结果
            Result res = new Result();
            res.setCode(result.getCode());
            res.setMessage(result.getMessage());
            BaseContext.setResponseBody(JsonUtils.serialize(res));

//            List<String> cookies = response.getHeaders().get("Set-Cookie");
        }

        // 返回修改后（或原始的）响应体内容
        return body;
    }
}
